﻿using System.Collections;
using System.Collections.Generic;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using NetAssist.Collections;
//using System.Collections;

namespace NetAssistTests
{
  [TestClass()]
  public class UniqueQueueTests
  {
    [TestMethod()]
    public void UniqueQueueConstructorsTest()
    {
      UniqueQueue<int> uq1 = new UniqueQueue<int>();
      uq1.Enqueue(1);
      uq1.Enqueue(2);
      uq1.Enqueue(3);

      UniqueQueue<int> uq2 = new UniqueQueue<int>(uq1);
      UniqueQueue<int> uq3 = new UniqueQueue<int>(10);

      while (uq1.Count != 0)
        Assert.IsTrue(uq1.Dequeue() == uq2.Dequeue());

      Assert.IsTrue(uq1.Count == 0);
      Assert.IsTrue(uq2.Count == 0);
    }

    [TestMethod()]
    public void UniqueQueueAccessTest()
    {
      UniqueQueue<int> uq1 = new UniqueQueue<int>(1000);
      uq1.Enqueue(1);
      uq1.Enqueue(2);
      uq1.Enqueue(3);
      uq1.Enqueue(1);

      uq1.TrimExcess();
      Assert.IsTrue(uq1.Count == 3);

      int[] arr = new int[] { 2, 3, 1 };
      int[] arr1;
      int[] arr2 = new int[3];
      object[] arr3 = new object[3];

      arr1 = uq1.ToArray();
      uq1.CopyTo(arr2, 0);
      uq1.CopyTo(arr3, 0);

      for (int i = 0; i < 3; i++)
        Assert.IsTrue(arr[i] == arr1[i] && arr[i] == arr2[i] && arr[i] == (int)arr3[i]);

      Assert.IsTrue(uq1.Peek() == 2);
      Assert.IsTrue(uq1.Contains(3));

      uq1.Clear();
      Assert.IsTrue(uq1.Count == 0);
    }

    [TestMethod()]
    public void UniqueQueueMiscTest()
    {
      UniqueQueue<int> uq1 = new UniqueQueue<int>();
      uq1.Enqueue(1);
      uq1.Enqueue(2);
      uq1.Enqueue(3);

      Assert.IsTrue(uq1.IsSynchronized == false);
      Assert.IsTrue(uq1.SyncRoot == uq1);

      Queue<int> q1 = uq1;

      while (q1.Count != 0)
        Assert.IsTrue(uq1.Dequeue() == q1.Dequeue());

      Assert.IsTrue(uq1.Count == 0);
      Assert.IsTrue(q1.Count == 0);

      int idx = 0;
      foreach (var item in (IEnumerable) uq1)
      {
        idx++;
        Assert.IsTrue((int)item == idx);
      }
    }
  }
}
